#ifndef __Flash_user_H
#define __Flash_user_H


#ifdef __cplusplus
extern "C" {
#endif 

#include "gd32e10x.h"

//Flash 存储范围0~0x200000 25Q16
//Flash 存储范围0~0x100000 25Q08
//Flash 存储范围0~0x80000 25Q04
//擦除时每块4k，先擦除再写入内容

#define FlashAddrOfRS		    	0x00000000	  //使用地址定义，长度0x1000，示例

#define StAddrOf_Up         0x01000 	      //128k, 程序较小，实际使用应该不超过30k
#define EndAddrOf_Up        0x21000 

/*
CAN 配置参数
A0A1为标记
之后固定4字节长度
最后1字节异或校验
*/
#define FlashAddrOfPara		    0x00021000	  

/*
CAN 配置参数 最多512字节
A0A2为标记
最后1字节异或校验
*/
#define FlashAddrOfPara512		0x00022000



/*
存储UTC时间
定义一个写入规则
开机查找最后有效空位置，最后一块的sector的最后16字节，不写入数据，从0块再开始写。

定义提取规则，从起始地址开始每次读8字节，查找有效数据
每8字节存1个UTC，如果符合UTC格式，且后8字节都是FF，则提取成最新时间。

8字节UTC定义，标记F1，UTC时间占4字节，校验为4个UTC字节的异或和，最后2字节默认FF
*/
#define FlashAddrOfUTC				0x00023000		//占用12k，理论每30秒写8字节，10万次循环可用54年
#define FlashAddrOfUTCEnd				(0x00027000 - 8)



//参数表地址01，实际只存950字节，限制
#define FlashAddrOfParaTable1024		0x00027000
//参数表地址02 备份
#define FlashAddrOfParaTable1024Bank		0x00028000


//存CA证书
//格式，标记字节AB，长度WORD 内容 最后 XOR（仅为内容部分）

#define FlashAddrOfCA		    	0x00029000
#define FlashAddrOfCABank		    0x0002A000


//存储位置信息 256k，暂定128字节一条，计划存储3天的数据。2000条（如果每条64字节可存4000条）
#define FlashAddrOfLocationMessStart		0x0002C000
#define FlashAddrOfLocationMessEnd		   0x0006C000


//new others start adr
#define FlashAddrOfNew		    0x0006D000




/*
存指定长度参数，最大1024
注意保存和提取长度要一样
返回0保存参数成功
返回1保存失败
*/
uint8_t savePara1024(uint8_t *para, uint16_t len);




/*
取指定长度参数，最大1024
注意保存和提取长度要一样
返回0读取参数成功
返回1失败
*/
uint8_t readPara1024(uint8_t * pPara, uint16_t len);





/*
测试Flash, 注意测试时会把擦除所有Flash内容
Flash的读写可以参照下面例子
*/
void testAllFlash(void);


/*
返回0保存参数成功
返回1保存失败
*/
uint8_t savePara(uint32_t para);
uint8_t clearPara1024(void);
/*
返回0读取参数成功
*/
uint8_t readPara(uint32_t * pPara);



#ifdef __cplusplus
}
#endif


#endif



